package com.situ.stl.api;

import com.situ.stl.Service.UserService;
import com.situ.stl.model.Account;
import com.situ.stl.model.User;
import com.situ.stl.util.JsonResult;
import com.situ.stl.util.JwtUtils;
import com.wf.captcha.SpecCaptcha;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.Setter;
import org.jasypt.util.password.StrongPasswordEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.UUID;
@RestController
@RequestMapping(value = "/api/v1/users", produces = MediaType.APPLICATION_JSON_VALUE)
public class UserApi {
    // Redis操作模板，用于缓存数据
    private RedisTemplate<Object, Object> redisTemplate;
    private UserService userService;
    // 强密码加密器，用于密码校验
    private static final StrongPasswordEncryptor PE = new StrongPasswordEncryptor();
    @Setter
    @Value("${jwt.secret}")
    private String jwtSecret;

    @Autowired
    public void setRedisTemplate(RedisTemplate<Object, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    //验证码生成方法
    @GetMapping("/captcha")
    public void captcha(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        SpecCaptcha captcha = new SpecCaptcha(140, 40, 4);
        // 设置响应格式为GIF图片
        resp.setContentType("image/gif");
        // 禁用缓存（防止浏览器缓存验证码图片）
        resp.setHeader("Pragma", "No-cache");
        resp.setHeader("Cache-Control", "no-cache");
        resp.setDateHeader("Expires", 0);

        //req.getSession().setAttribute("captcha", captcha.text().toLowerCase());
        // 将验证码文本（转为小写）存入Redis，有效期3分钟
        redisTemplate.opsForValue().set(
                "captcha",  // key：固定为"captcha"
                captcha.text().toLowerCase(),  // value：验证码文本（小写）
                Duration.ofMinutes(3));  // 过期时间：3分钟
// 将验证码图片输出到响应流（前端可直接通过<img>标签访问该路径显示图片）
        captcha.out(resp.getOutputStream());
    }


    //处理登陆方法
    @PostMapping("/login")
    public ResponseEntity<JsonResult<?>> login(@RequestBody Account account) {
        // 从Redis中获取存储的正确验证码
        String correct = (String) redisTemplate.opsForValue().get("captcha");
        // 比对用户输入的验证码与Redis中存储的验证码
        if (!account.getCaptcha().equals(correct)) {
            return ResponseEntity.ok(JsonResult.fail("验证码不正确"));
        }

        // 2. 根据手机号查询用户（假设用户名是手机号）
        User user = userService.findByPhone(account.getUsername());
        if (user == null) {
            return ResponseEntity.ok(JsonResult.fail("用户不存在"));
        }

        //校验密码（明文与加密存储的密码比对）
        boolean pass = PE.checkPassword(account.getPassword(), user.getPassword());
        if (!pass) {
            return ResponseEntity.ok(JsonResult.fail("密码不正确"));
        }

        //颁发jwt
        String jwt = JwtUtils.createJwt(UUID.randomUUID().toString(),// JWT的唯一标识（jti）
                user.getPhone(),// 主题（subject），这里用手机号
                Map.of("username", user.getPhone(), "userId", user.getId()),// 自定义载荷（包含用户ID和手机号）
                LocalDateTime.now().plusMinutes(30),// 过期时间：30分钟后
                jwtSecret);// 签名密钥（从配置文件读取）
        System.out.println(jwt);// 打印生成的JWT（实际生产环境可删除）

// 5. 返回成功响应，包含JWT令牌
        return ResponseEntity.ok(JsonResult.success(jwt));
    }

}
